home *** CD-ROM | disk | FTP | other *** search
/ Apple II Magazines (DO) / Softdisk Magazette Volume 2, No. 04 (1982-12)(Softdisk)(Side B).zip / Softdisk Magazette Volume 2, No. 04 (1982-12)(Softdisk)(Side B).do / OTHELLO.bas < prev    next >
BASIC Source File  |  1996-12-24  |  8KB  |  132 lines

  1. 10  GOTO 1120
  2. 20  REM OTHELLO
  3. 30  REM WRITTEN BY ALLEN MAYNARD
  4. 40  REM 1603 FARMSTEAD AVE.
  5. 50  REM HACIENDA HTS, CA  91745
  6. 60  REM 
  7. 70  REM REVISION 1.0, 10/30/82  
  8. 80  REM 
  9. 90  REM REVISED BY GERALD J. DURAND
  10. 100  REM DURAND INTERSTELLAR RESEARCH GROUP
  11. 110  REM 219 OAK WOOD WAY
  12. 120  REM LOS GATOS, CA  95030
  13. 130  REM 
  14. 140  REM SCORE AND UPDATE SUBROUTINE
  15. 150  NOTRACE 
  16. 160  REM FIND ANY RUNS OF FLIPPABLE PIECES
  17. 170 S1 = 0: FOR K = 1 TO 8:I5 = I4(K):J5 = J4(K):I6 = I +I5:J6 = J +J5:S3 = 0: IF A(I6,J6) < >T2  THEN 250
  18. 180  REM COUNT NUMBER OF PIECES IN RUN
  19. 190 S3 = S3 +1:I6 = I6 +I5:J6 = J6 +J5: IF A(I6,J6) = T1  THEN S1 = S1 +S3: GOTO 220
  20. 200  IF A(I6,J6) = 0  THEN 250
  21. 210  GOTO 190
  22. 220  REM ONLY UPDATE BOARD IF U=1
  23. 230  IF U < >1  THEN 250
  24. 240 I6 = I:J6 = J: FOR K1 = 0 TO S3:A(I6,J6) = T1:I6 = I6 +I5:J6 = J6 +J5: NEXT K1
  25. 250  NEXT K
  26. 260  RETURN 
  27. 270  REM COMPUTER'S MOVE
  28. 280  VTAB 24: HTAB 1: INVERSE : PRINT "COMPUTER THINKING, PLEASE DON'T DISTURB";: NORMAL : CALL 64668: VTAB 23: HTAB 1: CALL 64668: VTAB 22: CALL 64668
  29. 290 B1 =  -1:I3 = 0:J3 = 0:T1 = C:T2 = H
  30. 300  REM SCAN FOR BLANK SQUARE (0=BLANK)
  31. 310  FOR I = 1 TO 8: FOR J = 1 TO 8: IF A(I,J) < >0  THEN 500
  32. 320  REM DOES THE BLANK SQUARE HAVE AN OPPONENT AS A NEIGHBOR?
  33. 330  FOR I1 = I -1 TO I +1: FOR J1 = J -1 TO J +1: IF A(I1,J1) = T2  THEN 380
  34. 340  REM NO OPPONENT FOUND, KEEP LOOKING
  35. 350  NEXT J1: NEXT I1
  36. 360  REM NO OPPONENTS NEXT TO THIS SQUARE, TRY NEXT SQUARE
  37. 370  GOTO 500
  38. 380 U =  -1: GOSUB 140
  39. 390  REM TRY NEXT SQUARE IF NO FLIPS POSSIBLE
  40. 400  IF S1 = 0  THEN 500
  41. 410  REM FLIPS POSSIBLE, ADD 2 EXTRA POINTS FOR A WALL POSITION AND 4 FOR A CORNER
  42. 420  IF I = 1  OR I = 8  THEN S1 = S1 +2
  43. 430  IF J = 1  OR J = 8  THEN S1 = S1 +2
  44. 440  REM TRY NEXT SQUARE IF THIS IS NOT AT LEAST EQUAL TO THE BEST SCORE SO FAR
  45. 450  IF S1 <B1  THEN 500
  46. 460  REM IF THIS IS A TIE FOR BEST, MAKE A RANDOM DECISION FOR BEST
  47. 470  IF S1 = B1  THEN  IF  RND(1) >.5 GOTO 500
  48. 480  REM UPDATE BEST SCORE SO FAR
  49. 490 B1 = S1:I3 = I:J3 = J
  50. 500  NEXT J: NEXT I
  51. 510  REM CHECK FOR FORFEIT
  52. 520  IF B1 >0  THEN 580
  53. 530  VTAB 22: HTAB 1: PRINT "COMPUTER'S MOVE  (R,C): 0,0 FLIPPED: 0";: CALL 64668: VTAB 23: FLASH : HTAB 1: PRINT "I HAVE TO FORFIET MY MOVE";: NORMAL : CALL 64668
  54. 540  REM IF BOTH COMPUTER & HUMAN FORFEIT, GAME OVER
  55. 550  IF Z = 1  THEN 930
  56. 560  REM SET FORFIET FLAG AND GO TO HUMAN'S MOVE
  57. 570 Z = 1: GOTO 650
  58. 580  REM CLEAR FORFIET FLAG & MAKE COMPUTER'S MOVE
  59. 590 Z = 0: VTAB 22: HTAB 1: PRINT "COMPUTER'S MOVE  (R,C): "I3","C$(J3)" FLIPPED: ";:I = I3:J = J3:U = 1: GOSUB 140:C1 = C1 +S1 +1:H1 = H1 -S1:N1 = N1 +1
  60. 600  PRINT S1;: CALL 64668
  61. 610  REM UPDATE BOARD DISPLAY
  62. 620  GOSUB 1050
  63. 630  REM TEST FOR END OF GAME (HUMAN SCORE = 0 OR ALL SPACES FILLED)
  64. 640  IF H1 = 0  OR N1 = 64  THEN 930
  65. 650  REM HUMAN'S MOVE
  66. 660 T1 = H:T2 = C: VTAB 24: HTAB 1: PRINT "PLEASE ENTER YOUR MOVE (ROW,COL.) ";: CALL 64668: GET I$:I =  VAL(I$): PRINT I;: IF I = 0  THEN  VTAB 23: HTAB 1: FLASH : PRINT "DO YOU WISH TO FORFEIT? (Y/N)";: NORMAL : CALL 64668: GET I$: IF I$ = "Y"  THEN 270
  67. 670  IF I = 0  THEN  VTAB 23: HTAB 1: CALL 64668: GOTO 660
  68. 680  IF I >0  AND I <9  THEN 700
  69. 690  VTAB 23: HTAB 1: FLASH : PRINT  CHR$(7)">>>>> INVALID ENTRY <<<<<";: NORMAL : CALL 64668: GOTO 660
  70. 700  PRINT ",";: GET X$:J = 1
  71. 710  IF C$(J) = X$  THEN 740
  72. 720 J = J +1: IF J <9  THEN 710
  73. 730  GOTO 690
  74. 740  REM IS THAT SQUARE EMPTY?
  75. 750  PRINT X$;
  76. 760  IF A(I,J) < >0  THEN  VTAB 23: HTAB 1: FLASH : PRINT  CHR$(7);"SORRY, THAT SQUARE IS OCCUPIED";: NORMAL : CALL 64668: GOTO 660
  77. 770  REM CHECK FOR LEGAL NEIGHBOR
  78. 780 I1 = I -1:J1 = J -1
  79. 790  IF A(I1,J1) = T2  THEN 820
  80. 800 I1 = I1 +1: IF I1 <I +2  THEN 790
  81. 810 I1 = I -1:J1 = J1 +1: IF J1 <J +2  THEN 790
  82. 820  REM CHECK IF LEGAL RUN
  83. 830 U =  -1: GOSUB 140: IF S1 <1  THEN  VTAB 23: HTAB 1: FLASH : PRINT  CHR$(7)"SORRY, THAT DOESN'T FLANK A ROW.";: NORMAL : CALL 64668: GOTO 660
  84. 840  REM EVERYTHING'S LEGAL, MAKE HUMAN'S MOVE & CLEAR FORFEIT FL<CTRL-A>AG
  85. 850 Z = 0: VTAB 21: HTAB 1: PRINT "HUMAN'S MOVE (ROW,COL): "I","C$(J)" FLIPPED: "S1"    ";: CALL 64668
  86. 860  VTAB 23: HTAB 1: CALL 64668: VTAB 24: HTAB 1: CALL 64668
  87. 870  REM UPDATE BOARD
  88. 880 U = 1: GOSUB 140:H1 = H1 +S1 +1:C1 = C1 -S1:N1 = N1 +1
  89. 890  REM PRINT OUT BOARD
  90. 900  GOSUB 1050
  91. 910  REM TEST FOR END OF GAME, IF NOT, GO TO COMPUTER'S MOVE
  92. 920  IF C1 >0  AND N1 <64  THEN 270
  93. 930  REM END OF GAME WRAPUP
  94. 940  VTAB 23: HTAB 1: PRINT "COMPUTER: "C1", HUMAN: "H1", ";
  95. 950  IF H1 = C1  THEN  PRINT "IT'S A TIE!": GOTO 970
  96. 960  IF H1 >C1  THEN  PRINT "YOU WON IT!";: GOTO 1030
  97. 970 C1 = C1 -H1: IF C1 <0  THEN C1 =  -C1
  98. 980  IF C1 <11  THEN  PRINT " A SQUEEKER!";: GOTO 1030
  99. 990  IF C1 <25  THEN  PRINT " HOT GAME!";: GOTO 1030
  100. 1000  IF C1 <39  THEN  PRINT " FIGHT!";: GOTO 1030
  101. 1010  IF C1 <53  THEN  PRINT " WALKAWAY!";: GOTO 1030
  102. 1020  PRINT " PERFECT GAME!";
  103. 1030  NORMAL : CALL 64668: VTAB 24: HTAB 1: PRINT "DO YOU WANT TO PLAY ANOTHER GAME? ";: CALL 64668: GET I$: IF I$ = "Y"  THEN  CLEAR : GOTO 10
  104. 1040  TEXT : HOME : VTAB 12: HTAB 12: PRINT "THANKS FOR PLAYING!": VTAB 1: HTAB 1: END 
  105. 1050  REM PRINT OUT BOARD
  106. 1060  VTAB 24: HTAB 1: CALL 64668
  107. 1070  FOR I = 1 TO 8: FOR J = 1 TO 8:II = (I -1) *4 +4:JJ = (J -1) *4 +4:AA = A(I,J)
  108. 1080  COLOR= 0: IF AA <0  THEN  COLOR= 15
  109. 1090  FOR ZZ = II TO II +2: HLIN JJ,JJ +2 AT ZZ: NEXT : COLOR= 0: IF AA >0  THEN  COLOR= 15
  110. 1100  PLOT JJ +1,II +1
  111. 1110  NEXT J: NEXT I: RETURN 
  112. 1120  REM START OF PROGRAM
  113. 1130  DIM A(10,10),I4(8),J4(8),X$(10): TEXT : HOME : VTAB 10: HTAB 7: PRINT "GREETINGS FROM OTHELLO II": PRINT : PRINT : PRINT "DO YOU WANT INSTRUCTIONS (Y OR N)? ";: GET X$: IF X$ = "N"  THEN 1220
  114. 1140  REM ANY OTHER CHARACTER, ASSUME INSTRUCTIONS ARE NEEDED
  115. 1150  HOME : SPEED= 0
  116. 1160  PRINT "OTHELLO IS PLAYED ON AN 8 X 8 CHECKER": PRINT "BOARD.  THE ROWS ARE NUMBERED 1 TO 8": PRINT "AND THE COLUMNS ARE LETTERED 'A' TO 'H'.": SPEED= 255: PRINT ,"  A B C D E F G H": FOR I = 1 TO 8: PRINT ,I" . . . . . . . .": NEXT 
  117. 1170  SPEED= 0: PRINT : PRINT "THE INITIAL CONFIGURATION IS BLANK,": PRINT "EXCEPT FOR THE FOUR CENTER SQUARES,": PRINT "WHICH FORM THE PATTERN...": SPEED= 255: PRINT : PRINT ,"4 . . . O - . . .": PRINT ,"5 . . . - O . . .": SPEED= 0
  118. 1180  PRINT : PRINT "YOU ARE THE '-' AT 4,E AND 5,D AND I AM": PRINT "THE '0' AT 4,D AND 5,E."
  119. 1190  PRINT : PRINT "TRY TO PLACE YOUR PIECE SO THAT IT": PRINT "OUTFLANKS MINE CREATING A HORIZONTAL,": PRINT "VERTICAL, OR DIAGONAL RUN OF MY PIECES": PRINT "BOUNDED ON EACH END BY AT LEAST ONE OF": PRINT "YOURS.": PRINT 
  120. 1200  PRINT "THIS WILL FLIP MY PIECES, TURNING THEM": PRINT "INTO YOURS.": PRINT : PRINT "NOTE:  YOU MUST CAPTURE AT LEAST ONE OF": PRINT "MY PIECES IN THIS WAY IF IT IS AT ALL": PRINT "POSSIBLE.  IF NOT, THEN YOU MUST"
  121. 1210  PRINT "FORFEIT YOUR TURN BY ENTERING '0' FOR": PRINT "YOUR ROW MOVE.": FOR I = 1 TO 25: PRINT : NEXT : SPEED= 255
  122. 1220  REM INIT PROGRAM
  123. 1230 F2 = 0: GR : COLOR= 14: FOR II = 3 TO 35  STEP 4: VLIN 3,35 AT II: HLIN 3,35 AT II: NEXT : HLIN 1,37 AT 0: HLIN 1,37 AT 1: HLIN 1,37 AT 2: HLIN 1,37 AT 36: HLIN 1,37 AT 37: HLIN 1,37 AT 38
  124. 1240  VLIN 1,37 AT 1: VLIN 1,37 AT 2: VLIN 1,37 AT 36: VLIN 1,37 AT 37: COLOR= 15
  125. 1250  FOR K = 16 TO 20  STEP 4: HLIN K,K +2 AT K: HLIN K,K +2 AT K +2: PLOT K,K +1: PLOT K +2,K +1: NEXT : PLOT 21,17: PLOT 17,21
  126. 1260  FOR K = 1 TO 8: READ I4(K): NEXT K: DATA 0,-1,-1,-1,0,1,1,1: FOR K = 1 TO 8: READ J4(K): NEXT K: DATA 1,1,0,-1,-1,-1,0,1: FOR K = 1 TO 8: READ C$(K): NEXT K: DATA A,B,C,D,E,F,G,H:I = 1
  127. 1270  FOR I = 0 TO 9: FOR J = 0 TO 9:A(I,J) = 0: NEXT J: NEXT I:A(4,4) =  -1:A(5,5) =  -1:A(4,5) = 1:A(5,4) = 1:C1 = 2:H1 = 2:N1 = 4:Z = 0
  128. 1280 C =  -1:H = 1
  129. 1290  REM HUMAN'S CHOICES
  130. 1300  HOME : PRINT "DO YOU WANT TO GO FIRST? (Y/N) ";: GET X$: HOME : IF X$ = "Y"  THEN 650
  131. 1310  IF X$ < >"N"  THEN  PRINT  CHR$(7);: GOTO 1300
  132. 1320  GOTO 270